<?php

namespace App\Providers;

use App\BaseResourceRegistrar;
use App\Helpers\Identity;
use App\Helpers\Lunar;
use Illuminate\Routing\PendingResourceRegistration;
use Illuminate\Routing\Route;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {

        // $this->app->bind('Illuminate\Routing\Route', BaseRoute::class);
        //
        // $this->app->bind(Route::class,BaseRoute::class);
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Route::macro('alias', function ($alias) {
        //     $this->action['alias'] = $alias;
        // });
        // Route::macro('getAliasName', function () {
        //     return $this->action['alias'] ?? null;
        // });

        // 添加一个路由方法 设置路由的别名及是否加入权限组
        Route::macro('aliasPermission', function ($alias, $permission = false, $index = '') {
            // 路由别名 有两个作用：
            // 1、记录操作日志时用于表达操作的含义
            // 2、作为权限的名称 权限分上下级所以命名规则是：文章管理.添加文章  文章管理.编辑文章  这样的两条路由在权限表中有一个相同的上级权限：文章管理
            $this->action['alias'] = $alias;
            // 路由是否加入权限【默认false】
            $this->action['permission'] = $permission;
            // 传入此参数表示此接口为同权限组接口中的基础接口 通常为列表信息 代表同权限组中的其他接口权限依赖于此接口权限，当需要赋予权限组中其他接口权限时此接口权限必须默认赋予
            $this->action['index'] = $index == 'index' ? true : false;
        });
        Route::macro('getAlias', function () {
            return $this->action['alias'] ?? null;
        });
        Route::macro('checkPermission', function () {
            return $this->action['permission'] ?? false;
        });
        Route::macro('checkIndex', function () {
            return $this->action['index'] ?? false;
        });
        // 约定 路由权限name【permissions表中name字段值】格式为：[POST]api/admin/teachers 即 请求方式 + uri
        Route::macro('getPermissionName', function () {
            $method = implode(",", $this->methods());
            $uri = $this->uri();
            return "[{$method}]{$uri}";
        });

        $registrar = new BaseResourceRegistrar($this->app['router']);

        $this->app->bind('Illuminate\Routing\ResourceRegistrar', function () use ($registrar) {
            return $registrar;
        });
        PendingResourceRegistration::macro('aliasPermissions', function ($alias_permission) {
            $this->options['aliasPermissions'] = $alias_permission;
            return $this;
        });

        //验证身份证号
        Validator::extend(
            'identityCard',
            function ($attribute, $value, $parameters, $validator) {
                return (new Identity($value))->validate();
                $idCard = $value;
                // 只能是18位
                if (strlen($idCard) != 18) {
                    return false;
                }
                // 取出本体码
                $idcard_base = substr($idCard, 0, 17);
                // 取出校验码
                $verify_code = substr($idCard, 17, 1);
                // 加权因子
                $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
                // 校验码对应值
                $verify_code_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
                // 根据前17位计算校验码
                $total = 0;
                for ($i = 0; $i < 17; $i++) {
                    $total += substr($idcard_base, $i, 1) * $factor[$i];
                }
                // 取模
                $mod = $total % 11;
                // 比较校验码
                if ($verify_code == $verify_code_list[$mod]) {
                    return true;
                }
                return false;
            }
        );
        Validator::replacer(
            'identityCard',
            function ($message, $attribute, $rule, $parameters) {
                return $message;
                //return str_replace($attribute,$rule,$message);
            }
        );
    }
}
